package bean;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import enums.EPosicao;
import enums.ETatica;

public class Time {
	
	private int codigo;
	private String nome;
	private String nomeCurto;
	
	private List<Jogador> elenco;
	private List<Jogador> titulares;
	private List<Jogador> reservas;
	
	private List<ETatica> taticasDisponiveis;
	
	public Time(String nome, String nomeCurto, int codigo) {
		this.nome = nome;
		this.nomeCurto = nomeCurto;
		this.codigo = codigo;
	}
	
	
	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}
	
	public void setElenco(List<Jogador> elenco) {
		this.elenco = elenco;
	}

	public List<Jogador> getElenco() {
		return elenco;
	}

	public void setTitulares(List<Jogador> titulares) {
		this.titulares = titulares;
	}

	public List<Jogador> getTitulares() {
		return titulares;
	}

	public void setReservas(List<Jogador> reservas) {
		this.reservas = reservas;
	}

	public List<Jogador> getReservas() {
		return reservas;
	}

	public String getNomeCurto() {
		return nomeCurto;
	}

	public void setNomeCurto(String nomeCurto) {
		this.nomeCurto = nomeCurto;
	}

	public int getCodigo() {
		return codigo;
	}

	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}

	public int getForcaDefensiva(){
		int retorno = 0;
		int contador = 0;
		int soma = 0;
		for (Jogador jogador : this.getTitulares()) {
			if(EPosicao.isPosicaoDefensiva(jogador.getPosicao())){
				contador++;
				soma = soma + jogador.getForcaAtual();
			}
		}
		retorno = soma / contador;
		return retorno;
	}
	
	public int getForcaOfensiva(){
		int retorno = 0;
		int contador = 0;
		int soma = 0;
		for (Jogador jogador : this.getTitulares()) {
			if(EPosicao.isPosicaoOfensiva(jogador.getPosicao())){
				contador++;
				soma = soma + jogador.getForcaAtual();
			}
		}
		retorno = soma / contador;
		return retorno;
	}


	/**
	 * Metodo que retorna as taticas disponiveis do time de acordo com seu elenco atual.
	 * @return
	 */
	public List<ETatica> getTaticasDisponiveis() {
		int zagueiros = 0;
		int meias = 0;
		int atacantes = 0;
		for(Jogador jogador : this.getElenco()){
			if(!jogador.isMachucado()){
				switch (jogador.getPosicao()) {
				case ZAGUEIRO:
					zagueiros = zagueiros + 1;
					break;
				case MEIA_DEFENSIVO:
				case MEIA_OFENSIVO:
					meias = meias + 1;
				case ATACANTE:
					atacantes = atacantes + 1;
					break;
				}
			}
				
		}
		taticasDisponiveis = Arrays.asList(ETatica.values());
		if(zagueiros < 3){
			taticasDisponiveis = null;
		} else if(zagueiros == 3){
			taticasDisponiveis.removeAll(ETatica.getTaticasComMaisDeTresZagueiros());
		} else if(zagueiros == 4){
			taticasDisponiveis.removeAll(ETatica.getTaticasComMaisDeQuatroZagueiros());
		} else if(zagueiros == 5){
			taticasDisponiveis.removeAll(ETatica.getTaticasComMaisDeCincoZagueiros());
		}
		if(taticasDisponiveis != null){
			if(meias < 2){
				taticasDisponiveis = null;
			} else if(meias == 2){
				if(taticasDisponiveis != null){
					taticasDisponiveis = new ArrayList<ETatica>();
					taticasDisponiveis.add(ETatica.QUATRO_DOIS_QUATRO);
				}
			}else if(meias == 3){
				taticasDisponiveis.removeAll(ETatica.getTaticasComMaisDeTresMeias());
			} else if(meias == 4){
				taticasDisponiveis.removeAll(ETatica.getTaticasComMaisDeQuatroMeias());
			} else if(meias == 5){
				taticasDisponiveis.removeAll(ETatica.getTaticasComMaisDeCincoMeias());
			}
		}
		if(taticasDisponiveis != null){
			if(atacantes == 0){
				taticasDisponiveis.removeAll(ETatica.getTaticasComMaisDeZeroAtacantes());
			} else if(atacantes == 1){
				taticasDisponiveis.removeAll(ETatica.getTaticasComMaisDeUmAtacantes());
			}else if(atacantes == 2){
				taticasDisponiveis.removeAll(ETatica.getTaticasComMaisDeDoisAtacantes());
			} else if(atacantes == 3){
				taticasDisponiveis.removeAll(ETatica.getTaticasComMaisDeTresAtacantes());
			} 
		}
		return taticasDisponiveis;
	}


	public void setTaticasDisponiveis(List<ETatica> taticasDisponiveis) {
		this.taticasDisponiveis = taticasDisponiveis;
	}
	
}
